package com.maychat.service.impl;

import com.maychat.config.Consts;
import com.maychat.pojo.MayChatSystemOptions;
import com.maychat.pojo.UserInfoToken;
import com.maychat.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class RedisServiceImpl {

    @Autowired
    private RedisUtils redisUtils;


    public UserInfoToken getUserToken(String tokenStr) {
        return (UserInfoToken) redisUtils.get(Consts.REDIS_KEY_MAYCHAT_WS_USER_TOKEN + tokenStr);
    }

    public UserInfoToken getUserTokenByUserId(String userId) {
        String tokenStr = (String) redisUtils.get(Consts.REDIS_KEY_MAYCHAT_WS_USER_ID + userId);
        return getUserToken(tokenStr);
    }

    public void saveUserToken(UserInfoToken token) {
        redisUtils.set(Consts.REDIS_KEY_MAYCHAT_WS_USER_TOKEN + token.getToken(), token, Consts.TIME_1DAY);
        redisUtils.set(Consts.REDIS_KEY_MAYCHAT_WS_USER_ID + token.getUserId(), token.getToken(), Consts.TIME_1DAY);
    }

    public void clearUserToken(String userId) {
        String tokenStr = (String) redisUtils.get(Consts.REDIS_KEY_MAYCHAT_WS_USER_ID + userId);
        if (tokenStr == null) return;
        redisUtils.del(Consts.REDIS_KEY_MAYCHAT_WS_USER_TOKEN + tokenStr);
    }

    public MayChatSystemOptions getSystemOptions() {
        MayChatSystemOptions options = (MayChatSystemOptions) redisUtils.get(Consts.REDIS_KEY_MAYCHAT_SYSTEM_OPTIONS);
        if (options == null) {
            options = new MayChatSystemOptions();
            redisUtils.set(Consts.REDIS_KEY_MAYCHAT_SYSTEM_OPTIONS, options);
        }
        return options;
    }

    public void updateSystemOptions(MayChatSystemOptions options) {
        redisUtils.set(Consts.REDIS_KEY_MAYCHAT_SYSTEM_OPTIONS, options);
    }

    public Long getUserConnHeartBeat(String uid) {
        return (Long) redisUtils.get(Consts.REDIS_KEY_MAYCHAT_WS_USER_CONN_HEART_BEAT + uid);
    }

    public void saveUserConnHeartBeat(String userId) {
        redisUtils.set(Consts.REDIS_KEY_MAYCHAT_WS_USER_CONN_HEART_BEAT + userId, System.currentTimeMillis(), Consts.TIME_1MIN);
    }

    public void clearUserConnHeartBeat(String userId) {
        redisUtils.del(Consts.REDIS_KEY_MAYCHAT_WS_USER_CONN_HEART_BEAT + userId);
    }

    public void clearUserContacts(String userId) {
        redisUtils.del(Consts.REDIS_KEY_MAYCHAT_WS_USER_CONTACTS + userId);
    }

    public void saveUserContacts(String userId, List<String> ids) {
        redisUtils.lSet(Consts.REDIS_KEY_MAYCHAT_WS_USER_CONTACTS + userId, ids, Consts.TIME_1WEEK);
    }

    public void addUserContact(String userId, String contactId) {
        List<String> userContacts = getUserContacts(userId);
        if (userContacts == null || userContacts.contains(contactId)) return;
        redisUtils.lSet(Consts.REDIS_KEY_MAYCHAT_WS_USER_CONTACTS + userId, contactId, Consts.TIME_1WEEK);
    }

    public List<String> getUserContacts(String userId) {
        return redisUtils.lGet(Consts.REDIS_KEY_MAYCHAT_WS_USER_CONTACTS + userId, 0, -1);
    }


    public void removeUserContact(String userId, String contactId) {
        redisUtils.lRemove(Consts.REDIS_KEY_MAYCHAT_WS_USER_CONTACTS + userId, 1, contactId);
    }
}
